#include <iostream>
using namespace std;

// 1、默认模板实参
// 默认模板实参只能在模板形参列表结尾提供；
// 模板实参列表中也只能省略结尾的若干个模板实参；
// 如果函数模板多次被声明，则同一位置的模板默认实参只能出现在其中一个声明中
template <int N = 2, int M = 2>
int add()
{
    return N + M;
}

template <typename T, typename U = int>
U cast(T a)
{
    return static_cast<U>(a);
}
int main()
{
    cout << add<>() << endl;
    cout << add<1>() << endl;
    // 会默认推导
    // int cast<double, int>(double a)
    cout << cast(3.14) << endl;
    return 0;
}